﻿using System;
using System.Windows;
using System.Windows.Media.Animation;
using System.Windows.Threading;

namespace DocBot
{
	// http://atikpassion.blogspot.de/2013/01/wpf-splash-animation-screen.html
	/// <summary>
	/// Interaktionslogik für SplashWindow.xaml
	/// </summary>
	public partial class SplashWindow : Window
	{
		public SplashWindow()
		{
			InitializeComponent();
			// UI-Elemente initialisieren.
			this.initializeUI();

			// Loaded-Eventhandler registrieren
			this.Loaded += new RoutedEventHandler(SplashScreen_Loaded);
			// Unloaded-EventHandler registrieren
			this.Unloaded += new RoutedEventHandler(SplashScreen_Unloaded);
		}

		#region Eventhandler

		/// <summary>
		/// Ereignishandler der ausgelöst wird, wenn die Form SplashScreen komplett geladen wurde.
		/// </summary>
		/// <param name="sender">Die Klasse SplashScreen als Objekt.</param>
		/// <param name="e">Die gerouteten Ereignisdaten.</param>
		/// <remarks></remarks>
		private void SplashScreen_Loaded(object sender, RoutedEventArgs e)
		{
			// eine IAsyncResult-Instanz für die Initialisierung
			// der Anwendung erzeugen
			IAsyncResult result = null;

			// dieser anonyme Delegat wird aufgerufen, wenn die
			// Initialisierung abgeschlossen wurde
			AsyncCallback initCompleted = delegate(IAsyncResult ar)
			{
				App.Current.ApplicationInitialize.EndInvoke(result);

				// Sicherstellen das Close auf dem UI Thread ausgeführt wird.
				// Deshalb wird auf den anwendungsweiten Delegaten Invoker gecastet.
				Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Invoker)delegate { Close(); });
			};

			// die Initialisierung der Anwendung starten
			result = App.Current.ApplicationInitialize.BeginInvoke(this, initCompleted, null);

			// als behandelt markieren
			e.Handled = true;
		}

		/// <summary>
		/// Ereignishandler der ausgelöst wird, wenn die Form SplashScreen entladen wurde.
		/// </summary>
		/// <param name="sender">Die Klasse SplashScreen als Objekt.</param>
		/// <param name="e">Die gerouteten Ereignisdaten.</param>
		/// <remarks></remarks>
		private void SplashScreen_Unloaded(object sender, RoutedEventArgs e)
		{
			if (this._contentLoaded)
			{
				// EventHandler löschen
				this.Loaded -= new RoutedEventHandler(SplashScreen_Loaded);
				this.Unloaded -= new RoutedEventHandler(SplashScreen_Unloaded);

				// Controls auf null setzen
				//this.lbl_Header = null;
				//this.btn_Cancel = null;
				this.lDescription = null;
			}
			// prüfen ob der Ladevorgang abgebrochen wurde
			if (e != null)
			{
				// hier konnen evtl. Dispose-Aufrufe von nicht mehr benötigten
				// Objekten ausgeführt werden.

				// kein Abbruch, Ereignis als behandelt markieren
				e.Handled = true;
			}
		}

		#endregion

		#region Helper Methods

		/// <summary>
		/// Initialisiert die UI-Elemente der Form.
		/// </summary>
		/// <remarks>
		/// Helper-Methode um das Initialisieren der UI-Elemente an einem Platz abwickweln zu können.
		/// </remarks>
		private void initializeUI()
		{
			// Titel des SplashScreen und Button Text zuweisen
			// sollte aus lokalisierten Resourcen erfolgen.
			//this.lbl_Header.Content = App.resourceManager.GetString("frm_TitelText", App.currentCulture);
			//this.btn_Cancel.Content = App.resourceManager.GetString("btn_CancelText", App.currentCulture);
		}

		#endregion
	}
}
